package config

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

// GetField 用于读取环境变量
func GetField(key string) string {
	// 从环境变量中获取值
	value := os.Getenv(key)
	if value != "" {
		return value
	}

	// 如果环境变量不存在，尝试从 .env 文件中读取
	envMap := loadEnvFile()
	if val, exists := envMap[key]; exists {
		return val
	}

	// 如果未找到，返回空字符串
	return ""
}

// GetFieldWithDefault 用于读取环境变量，支持默认值
func GetFieldWithDefault(key string, defaultValue string) string {
	value := GetField(key)
	if value == "" {
		return defaultValue
	}
	return value
}

// GetRequiredField 用于读取必需的环境变量，如果不存在则返回错误信息
func GetRequiredField(key string) (string, error) {
	value := GetField(key)
	if value == "" {
		return "", fmt.Errorf("缺少必需的配置项: %s", key)
	}
	return value, nil
}

// loadEnvFile 加载 .env 文件内容到 map 中
func loadEnvFile() map[string]string {
	envMap := make(map[string]string)
	filePath := ".env"

	// 尝试打开 .env 文件
	file, err := os.Open(filePath)
	if err != nil {
		// 如果文件不存在，打印警告信息并返回空的 envMap
		fmt.Printf("警告: 找不到 .env 文件 %s\n", filePath)
		return envMap
	}
	defer file.Close()

	// 逐行读取文件内容
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())
		if line == "" || strings.HasPrefix(line, "#") {
			continue // 跳过空行和注释行
		}

		// 解析键值对
		parts := strings.SplitN(line, "=", 2)
		if len(parts) == 2 {
			key := strings.TrimSpace(parts[0])
			value := strings.TrimSpace(parts[1])
			envMap[key] = value
		}
	}

	// 检查扫描过程中是否有错误
	if err := scanner.Err(); err != nil {
		fmt.Printf("读取 .env 文件时出错: %v\n", err)
	}

	return envMap
}